#coding:utf-8
#simple text scripter to analysis the script
#vision 0.201
import datetime
import img
import musicfx
import text,ui

import re
import define


def init_set_reader(init_set_file):
    try:
        set_file = open(init_set_file, 'r')
    except:
        print 'open file error'
        exit()
    for file_line_string in set_file.readlines():
        #提供注释功能
        if file_line_string[0] == '#':
            continue
        #麻烦的去乱七八糟的符号的东西。。。
        #改良了一下
        file_line_list = ' '.join(file_line_string.split('=')).split()
        apple = 0
        tmp_list = []
        #因为前面的改良，所以这个不需要了。。。
        #while len(cat) > apple:
        #    if cat[apple] is '':
        #        del cat[apple]
        #        apple -= 1
        #    apple += 1
        #拯救空行
        if file_line_list == []:
            continue
        #正式开始
        elif file_line_list[0] == 'GAME_CAPTION':
            define.GAME_CAPTION = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'SCREEN_FLAGS':
            define.SCREEN_FLAGS = int(file_line_list[1])
        elif file_line_list[0] == 'SCREEN_DEPTH':
            define.SCREEN_DEPTH = int(file_line_list[1])
        elif file_line_list[0] == 'SCRIPT_FILE':
            define.SCRIPT_FILE = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'SCREEN_SIZE':
            match = re.compile(r'\d+')
            tmp_list = match.findall(''.join(file_line_list[1:]))
            if tmp_list != []:
                define.SCREEN_SIZE = (int(tmp_list[0]),int(tmp_list[1]))
        elif file_line_list[0] == 'TEXT_SCREEN_SIZE':
            match = re.compile(r'\d+')
            tmp_list = match.findall(''.join(file_line_list[1:]))
            if tmp_list != []:
                define.TEXT_SCREEN_SIZE = (int(tmp_list[0]),int(tmp_list[1]))
        elif file_line_list[0] == 'TEXT_WINDOW_SIZE':
            match = re.compile(r'\d+')
            tmp_list = match.findall(''.join(file_line_list[1:]))
            if tmp_list != []:
                define.TEXT_WINDOW_SIZE = (int(tmp_list[0]),int(tmp_list[1]))
        elif file_line_list[0] == 'TEXT_WINDOW_POINT':
            match = re.compile(r'\d+')
            tmp_list = match.findall(''.join(file_line_list[1:]))
            if tmp_list != []:
                define.TEXT_WINDOW_POINT = (int(tmp_list[0]),int(tmp_list[1]))
        elif file_line_list[0] == 'TEXT_FONT':
            define.TEXT_FONT = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'TEXT_START_POINT':
            match = re.compile(r'\d+')
            tmp_list = match.findall(''.join(file_line_list[1:]))
            if tmp_list != []:
                define.TEXT_START_POINT = (int(tmp_list[0]),int(tmp_list[1]))
        elif file_line_list[0] == 'FONT_SIZE':
            define.FONT_SIZE = int(file_line_list[1])
        elif file_line_list[0] == 'CHOOSING_BUTTON_TEXT_EFFECT':
            define.CHOOSING_BUTTON_TEXT_EFFECT = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'CHOOSING_BUTTON_TEXT_SELECTED':
            define.CHOOSING_BUTTON_TEXT_SELECTED = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'START_BUTTON':
            define.START_BUTTON = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'START_BUTTON_ONCLICK':
            define.START_BUTTON_ONCLICK = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'LOAD_BUTTON':
            define.LOAD_BUTTON = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'LOAD_BUTTON_ONCLICK':
            define.LOAD_BUTTON_ONCLICK = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'OPTION_BUTTON':
            define.OPTION_BUTTON = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'OPTION_BUTTON_ONCLICK':
            define.OPTION_BUTTON_ONCLICK = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'EXIT_BUTTON':
            define.EXIT_BUTTON = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'EXIT_BUTTON_ONCLICK':
            define.EXIT_BUTTON_ONCLICK = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'START_BGM':
            define.START_BGM = ' '.join(file_line_list[1:])
        elif file_line_list[0] == 'START_BACKGROUND':
            define.START_BACKGROUND = ' '.join(file_line_list[1:])
        else:
            print 'no this set'
            

class Scripter(object):
    def __init__(self,filename,screen,screen_size):
        #判断并删除utf-8编码中的bom标记
        self.file = open(filename,'rb')
        content = self.file.read(3)
        if content != '\xEF\xBB\xBF':
            pass
        else:
            content = self.file.read()
            self.file.close()
            self.file = open(filename,'wb')
            self.file.write(content)
        self.file.close()
        #处理结束，重新打开文件并进行预处理
        self.file = open(filename)
        #预处理，加载跳转点,用于存储所有跳转点的列表,*用来标识跳转点
        self.jump_points = []
        while 1:
            try:
                tmp_line = self.file.readline()
                if tmp_line[0] == '*':
                    self.jump_points.append((tmp_line.strip(),self.file.tell()))
            except:
                break
        self.file.seek(0,0)
        #file.seek(0,0)后面那个参数0表示绝对位置跳转，若为1表示相对位置跳转
        #print self.jump_points
        #文件指针，用来存档用的。
        self.filepoint = None
        #当前运行的行号
        self.line_number = 0
        #背景对象，背景音乐对象，音效对象，文字对象
        self.screen = screen
        self.background = img.IMG(screen_size,screen)
        self.character = img.IMG(screen_size,screen)
        self.bgm = musicfx.BGM_FX()
        self.sound_effect = musicfx.SE_FX()
        self.voice = musicfx.SE_FX()#语音对象
        self.text_object = text.MyText(screen,define.TEXT_START_POINT)
        #选择菜单系列初始化
        self.choosing_menu = ui.ChoosingMenu()
        self.choosing_menu_on = False
        self.potint_to_select = []
        #很多全局变量
        self.START_MENU_ON = True
        self.MENU_ON = False
        #全局变量结束
        #self.bgm.play("bgm/bgm1.mp3")
        #self.background.load("pic.jpg")
        #self.text_object.text_content(u'每次打开冰箱之前，必须要明确态度。比起寒冷的说法，我更喜欢低温，虽然我有从图书馆的古籍中了解过前者，但老实说，抽象的形象会带来很多麻烦。不是冰凉的冒泡啤酒，而是10℃泡沫量超过标准值4％的低温啤酒。这样的说法，无论对啤酒本身，还对饮酒的人来说')
    def next_line(self):
        try:
            return self.file.next()
        except StopIteration:
            return "gameover"
        else:
            self.line_number+=1
    #解析器，用于解析文本文件的内容，从next_line()函数中接收文本的下一行内容
    def analysis(self,line_to_analysis):
        self.line_to_analysis = line_to_analysis.strip()
        #用空格分割字符串然后返回两个列表，第一个列表是指令，第二个列表是内容，第三个列表是参数（例如文本
        if self.voice.se_object:
            self.voice.stop()
        if self.sound_effect.se_object:
            self.sound_effect.stop()
        #显示下一行文本之前先清除上次回放的音效和语音 
        line_list = self.line_to_analysis.split(" ")
             #列表为空则表示脚本结束，返回0告诉主函数游戏结束
        command = line_list[0]
        #print "this is the content in ayalysis"+" "+content
        if command == 'goto':
            #第二个参数用0表示绝对位置跳转，用1表示相对当前读取的位置跳转
                self.file.seek(self.in_jumplist(line_list[1]),0)
        elif command == 'select':
            #print "select start"
            self.choosing_menu_on = True
            self.potint_to_select = []
            print self.choosing_menu_on
            option_numbers = (len(line_list)-1)/2
            texts = []
            i = 0
            print 'option number is '+str(option_numbers)
            while i <option_numbers:
                texts.append(unicode(line_list[i*2+1],'utf-8'))
                self.potint_to_select.append(line_list[(i+1)*2])
                i+=1
                #print texts
            self.choosing_menu.load(self.screen,texts)
            return
        elif command == "bg":
            try:
                self.background.load(line_list[1])
            except:
                print self.line_number
        #载入立绘，有默认参数则载入到参数规定的地方，默认载入到左边
        elif command == "ld":
            try:
                self.character.load(line_list[1],line_list[2])
            except:
                print 'ld command has no option,use default "left"'
                self.character.load(line_list[1],'left')
        #播放bgm不重复
        elif command == "bgmonce":
            self.bgm.play(line_list[1],1,0)
        elif command == "bgm": 
            self.bgm.play(line_list[1])
        elif command == "se":
            self.sound_effect.play()
        elif command == "bgmstop":
            self.bgm.stop()
        elif command == "voice":
            self.voice.play(line_list[1])
        elif command == "volume":
            if self.voice.se_object is not None:
                self.voice.set_volume(line_list[1])
            if self.bgm.filename is not "":
                self.bgm.set_volume(line_list[1])
            if self.sound_effect.se_object is not None:
                self.sound_effect.set_volume(line_list[1])
        elif command == "stopall":#经过测试，这条命令有执行，但是BGM还在播放。。。
            musicfx.stop()
        elif command == "txt":
            #
            self.text_object.get_text(unicode(' '.join(line_list[1:]),'utf-8'))#这里这个参数必须加，否则编码将不正常
            return 1#返回1表示游戏尚未结束
        elif command == "gameover":
            self.MENU_ON = True
        else:
            print "command "+command+" error"
        
        #除了显示文本之外全立即处理下一行脚本，解决每次需要点一次鼠标才能载入下一行的问题
        #加入一个检测，防止在文本结束之前会使程序陷入一个死递归当中，这行代码检测的内容是文本是否结束，如果结束则放弃读取下一行
        tmp_line = self.next_line()
        if tmp_line != 'gameover':
            self.analysis(tmp_line)
        
    def in_jumplist(self,point):
        #此函数在已经生成了跳转列表里检验是否有指定跳转点，然后返回一个文件指针指示跳转点位置
        for jump_point in self.jump_points:
            if jump_point[0] == point:
                return jump_point[1]
    def save(self):
        time = str(datetime.datetime.now())[:-7]
        save_info = self.file.tell()+' '+self.text_object.text_content+' '+self.bgm.filename+' '+self.background.image_name+' '+self.character.image_name
        save_file = open('save.dat','w')
        save_file.write(str(save_info)+' '+time)
        save_file.close()